package com.youxue.teachin.update;

import java.io.File;

import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import com.youxue.teachin.BuildConfig;

/**
 * 在此写用途
 *
 * @author: zhiwei
 * @date: 2017-10-30 22:57
 * @version: 9.1.0
 */
public class DownloadUtils {
    public static final void downloadFile(Context context, String apkUrl) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse(apkUrl));
        context.startActivity(intent);
    }



    public static long downloadFile(Context context, String downloadUri, String saveFile, String title, String description){
        // 创建下载请求
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUri));

        /*
         * 设置在通知栏是否显示下载通知(下载进度), 有 3 个值可选:
         *    VISIBILITY_VISIBLE:                   下载过程中可见, 下载完后自动消失 (默认)
         *    VISIBILITY_VISIBLE_NOTIFY_COMPLETED:  下载过程中和下载完成后均可见
         *    VISIBILITY_HIDDEN:                    始终不显示通知
        */
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        // 设置通知的标题和描述
        request.setTitle(title);
        request.setDescription(description);

        /*
         * 设置允许使用的网络类型, 可选值:
         *     NETWORK_MOBILE:      移动网络
         *     NETWORK_WIFI:        WIFI网络
         *     NETWORK_BLUETOOTH:   蓝牙网络
         * 默认为所有网络都允许
         */
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
        // 添加请求头
        // request.addRequestHeader("User-Agent", "Chrome Mozilla/5.0");

        // 设置下载文件的保存位置
        File file = new File(saveFile);
        if (!file.exists()) {
            file.mkdirs();
        }
        request.setDestinationUri(Uri.fromFile(file));

        /*
         * 2. 获取下载管理器服务的实例, 添加下载任务
         */
        DownloadManager manager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);

        // 将下载请求加入下载队列, 返回一个下载ID
        long downloadId = manager.enqueue(request);
        return downloadId;
    }

    public static float queryDownloadProgress(Context context, long downloadId) {
        // 获取下载管理器服务的实例
        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

        // 创建一个查询对象
        DownloadManager.Query query = new DownloadManager.Query();

        // 根据 下载ID 过滤结果
        query.setFilterById(downloadId);

        // 还可以根据状态过滤结果
        // query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);

        // 执行查询, 返回一个 Cursor (相当于查询数据库)
        Cursor cursor = manager.query(query);

        if (!cursor.moveToFirst()) {
            cursor.close();
            return 0;
        }

        // 下载ID
        long id = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID));
        // 下载请求的状态
        int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
        // 下载文件在本地保存的路径（Android 7.0 以后 COLUMN_LOCAL_FILENAME 字段被弃用, 需要用 COLUMN_LOCAL_URI 字段来获取本地文件路径的 Uri）
        String localFilename = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
        // 已下载的字节大小
        long downloadedSoFar = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        // 下载文件的总字节大小
        long totalSize = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

        cursor.close();

        if (BuildConfig.DEBUG) {
            System.out.println("下载进度: " + downloadedSoFar  + "/" + totalSize);
        }

            /*
             * 判断是否下载成功，其中状态 status 的值有 5 种:
             *     DownloadManager.STATUS_SUCCESSFUL:   下载成功
             *     DownloadManager.STATUS_FAILED:       下载失败
             *     DownloadManager.STATUS_PENDING:      等待下载
             *     DownloadManager.STATUS_RUNNING:      正在下载
             *     DownloadManager.STATUS_PAUSED:       下载暂停
             */
        if (status == DownloadManager.STATUS_SUCCESSFUL) {
            /*
             * 特别注意: 查询获取到的 localFilename 才是下载文件真正的保存路径，在创建
             * 请求时设置的保存路径不一定是最终的保存路径，因为当设置的路径已是存在的文件时，
             * 下载器会自动重命名保存路径，例如: .../demo-1.apk, .../demo-2.apk
             */
            if (BuildConfig.DEBUG) {
                System.out.println("下载成功, 打开文件, 文件路径: " + localFilename);
            }
            return 100;
        }
        return downloadedSoFar / totalSize;
    }
}
